package shg.book.control
{
	
	import flash.events.Event;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.geom.Point;
	import flash.net.FileFilter;
	import flash.net.URLRequest;
	import flash.net.URLStream;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextLineMetrics;
	import flash.utils.ByteArray;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Text;
	import mx.core.FlexBitmap;
	import mx.events.FlexEvent;
	import mx.managers.PopUpManager;
	
	import shg.book.util.MD5;
	import shg.book.view.AuthorEdit;
	
	
	public class ReadTextFile
	{
		//文件选择过滤
		private var fileFileter:FileFilter;
		//转换之后的纯文本数据
		
		public var fileDate:String;
		private var text:String="";
		
		
		//每一页的字符都是存储在里面的
		private var pages:ArrayCollection;
		//选择文件的路径,生成的文件也是存放在这个文件里面
		private var filePath:String;
		//生成文件的名称
		private var fileName:String;
		private var loadFile:File;
		//纯文本的总长度
		private var fileLength:String="";
		//图片的长度
		private var imgLength:String="";
		//样式长度
		private var styleLength:String="";
		//各个封面数组长度
		private var conver_size_length:String="";
		
		private var md5:MD5;
		//加密后的密钥
		private var create_password:String="";
		//文本内容加密后的MD5，用于判断用户是修改文本内容
		private var allContent_password:String;
		//加密之后的文本内容
		private var last_content:String;
		//数据的索引内容
		private var bookContent:ByteArray;
		//保存书本的路径
		private var saveBookPath:String="C:\\book\\Text\\";
		
		private var authorEdit:AuthorEdit;
		
		
		/**
		 * 打开文本文件
		 * title 标题
		 * tyble 类型
		 * */
		public  function openFile(edit:AuthorEdit):void{
			authorEdit=edit;
			fileFileter=new FileFilter("选择文件*.txt *.xml","*.txt;*.xml");
			var file:File=File.documentsDirectory;
			file.browseForOpen("打开文件",[fileFileter]);//默认为用户文档路径
			file.addEventListener(Event.SELECT,loadGBTrans);
		}
		
		/** 
		 * 使用URLStream取代URLLoader来读取GB数据
		 * */
		public function loadGBTrans(event:Event):void{
			loadFile=event.target as File;
		    filePath=loadFile.nativePath.toString();//获取选择文件的路径
			fileName=loadFile.name;
			var request:URLRequest = new URLRequest(filePath);
			var loader:URLStream = new URLStream();
			loader.addEventListener(Event.COMPLETE, fileSelect);
			loader.load(request);
		}
		/**
		 * 首先把字符串转为字节流
		 * 这里需要转换两个部分
		 * 一：文本的内容
		 * 
		 * */
		private function fileMD5(event:Event):void{
			//封面图片的长度的长度
			
			//纯文本内容长度
			var fileStream:URLStream=event.currentTarget as URLStream;
			var byteArray:ByteArray=new ByteArray();
			fileDate=fileStream.readMultiByte(fileStream.bytesAvailable,"GB2312");
			byteArray.writeMultiByte(fileDate,"UTF-8");
			fileLength=setLength(byteArray.length);
			//组装样式长度
			var fileStyle:String="&"+authorEdit.simple_Family+"&"+authorEdit.simple_Color+"&"+
				authorEdit.simple_FontSize+"&"+authorEdit.simple_Weight;
			byteArray.clear();
			byteArray.writeMultiByte(fileStyle,"UTF-8");
			styleLength=setLength(byteArray.length);
			
		}
		
		/**
		 * 读取文本文件
		 * 将读取的内容进行转换后输出，GB的数据被正确显示
		 * */
		public function fileSelect(event:Event):void{
			if(bookContent==null)
				bookContent=new ByteArray();
			
			var fileStream:URLStream=event.currentTarget as URLStream;
			//文本内容
		    var contentByte:ByteArray=new ByteArray();
			fileStream.readBytes(contentByte);
			
			//样式字符串
			var bookStyle:String=authorEdit.simple_Family+"&"+authorEdit.simple_Weight+"&"+
				authorEdit.simple_FontSize.toString()+"&"+authorEdit.simple_Color.toString();
			
			if(authorEdit.create_password.length>0 && authorEdit.charge_book.selected){
				changeBook(bookContent,contentByte,bookStyle);
			}else{
				freeBook(bookContent,contentByte,bookStyle);
			}
			
			//最后把字节流写入文件
			var file:File=new File(createFilePath(saveBookPath));
			var stream:FileStream=new FileStream();
			stream.open(file,FileMode.WRITE);
			stream.writeBytes(bookContent);
			stream.close();
			//询问打开刚才保存的书籍的目录还是预览刚才制作的书籍
			authorEdit.openBook(saveBookPath);
		}
		/**
		 * 加密次数：
		 * 		第一次加密是用户输入的密钥进行加密得到的MD5；
		 * 		第二次加密是对 样式字符串+表示四张封面图片大小的字符串+文本长度（十位数，不够补零）+样式长度（十位数，不够补零）+图片数组长度（十位数，不够补零）+用户密钥字符串加密得到的MD5；
		 * 		第三次加密是和第二次加密的区别在于不需要用户密钥字符串加密得到的MD5，加密后的字符串保存在文本字符串的前面
		 * 如果这本书籍是收费的书籍话就存储数据的顺序是
		 * 一：首先存储四张封面图片的数据
		 * 二：存储文本内容
		 * 二：存储三次加密的密钥
		 * 三：存储村文本的文本内容
		 * 四：存储四张封面图片的各个大小，他们之间用&符号隔开 例如：（1222&1232表示第一张图片的大小是1222字节，第二张图片的大小是1232字节）
		 * 五：存储样式长度格式为0000000000
		 * 六：存储纯文本的长度格式为0000000000
		 * 七：存储四张图片大小的数组长度格式为0000000000
		 * 八：一个十位的字符串数组0000000000表示文本格式0000000001表示HTML格式
		 * */
		private function changeBook(bookContent:ByteArray,contentByte:ByteArray,bookStyle:String):void{
			bookContent.writeBytes(authorEdit.fourCoverPage);
			bookContent.writeBytes(contentByte);
			contentByte.position=0;
			var contentStr:String=contentByte.readMultiByte(contentByte.bytesAvailable,"GB2312");
			if(md5==null)
				md5=new MD5();
			//第二次加密
			var str:String=bookStyle+authorEdit.conver_size+setLength(contentByte.length)
				+setLength(bookStyle.length)+setLength(authorEdit.conver_size.length)+setLength(0);
			var createPasswordTwo:String=md5.getMD5(str+contentStr+authorEdit.create_password);
			//第三次加密是为了检查文本是否被更改
			var createPasswordThree:String=md5.getMD5(str+createPasswordTwo);
			//在把文本内存存储在字节数组里面，
			bookContent.writeMultiByte( createPasswordThree+str,"UTF-8");
		}
		/**
		 * 一：一个十位的字符串数组0000000000表示文本格式0000000001表示HTML格式
		 * 二：存储四张图片大小的数组长度格式为0000000000
		 * 三：存储样式长度格式为0000000000
		 * 四：存储纯文本的长度格式为0000000000
		 * 五：存储四张封面图片的各个大小，他们之间用&符号隔开 例如：（1222&1232表示第一张图片的大小是1222字节，第二张图片的大小是1232字节）
		 * 六：存储样式字符串长度
		 * 七：存储村文本的文本内容
		 * 八：存储密钥
		 * */
		private function freeBook(bookContent:ByteArray,contentByte:ByteArray,bookStyle:String):void{
			var contentStr:String=contentByte.readMultiByte(contentByte.bytesAvailable,"GB2312");
			if(md5==null)
				md5=new MD5();
			var str:String=setLength(0)+setLength(authorEdit.conver_size.length)+setLength(bookStyle.length)+
				setLength(contentByte.length)+authorEdit.conver_size+bookStyle;
			//第一次加密文件，只需验证文本内容是否被改得即可
			var createPasswordOne:String=md5.getMD5(str+contentStr);
			//二次加密
			var createPasswordTwo:String=md5.getMD5(str+createPasswordOne);
			//最后组成的文本格式
			bookContent.writeMultiByte(createPasswordTwo+str,"UTF-8");
			bookContent.writeBytes(contentByte);
			bookContent.writeBytes(authorEdit.fourCoverPage);
		}
		/**
		 * 创建文件的目录文件夹！如果在指定的文件夹下存在同样名称的数据就需要在在后面加一
		 * */
		private function createFilePath(path:String):String{
			var fileBooPath:String=path+authorEdit.bookName.text+".txt";
			var file:File=new File(fileBooPath);
			var exit:Boolean=file.exists;
			for(var i:uint=1;exit;i++){
				fileBooPath=path+authorEdit.bookName.text+"("+i+").txt";
				file=new File(fileBooPath);
				exit=file.exists;
			}
			return fileBooPath;
		}
		/**
		 * 传进来一个整数返回一个有0组成的字符串
		 * */
		private function setLength(_str:Number):String{
			var str_length:String=String(_str);
			var str:String="";
			if(str_length!=null){
				for(var r:int=0;r<10-String(_str).length;r++){
					str+="0";
				}
			}else{
				return "0000000000";
			}
			str_length=str+str_length;
			return str_length;
		}
		
		/**
		 * 将数据信息保存进入文件里面去
		 * 这里的文件需要保存的图片信息包括
		 * 一：书本的封面的四张图片的保存
		 * 二：文字信息
		 * 三：样式信息
		 * 四：密钥信息
		 * 
		 * */
		private function saveToFile(pages:ArrayCollection):void{
			//位文字信息和样式信息
			var array:Array=fileName.split(".");
			fileName="";
			//首先去掉文件的后缀
			for(var i:uint=0;i<array.length;i++){
				if(i!=(array.length-1)){
					fileName+=array[i];
				}else{
					fileName+="book.txt";
				}
			}
			var startIndex:uint=loadFile.parent.nativePath.length;
			var endIndex:uint=filePath.length-fileName.length;
			var str:String=filePath.substring(startIndex,endIndex);
			var file:File=new File(loadFile.parent.nativePath+str+fileName);
			var fileStream:FileStream=new FileStream();
			fileStream.open(file,FileMode.WRITE);
			for(var L:uint;L<pages.length;L++){
				fileStream.writeMultiByte(pages[L].toString(),"UTF-8");
			}
			fileStream.close();
		}
		/**
		 * 设置文本的题目样式
		 * 和设置题目位置
		 * 
		 * */
		public function setTitleStyle(authorEdit:AuthorEdit,selectValue:String):void{
			if(selectValue=="posiction_h"){//水平放置
				authorEdit.book_title_v.visible=false;
				authorEdit.book_title_h.visible=true;
			}else{//垂直放置
				authorEdit.book_title_v.visible=true;
				authorEdit.book_title_h.visible=false;
			}
		}
		
	}
}